package heap
/*
符号引用
 */
// symbolic reference
type SymRef struct {
	Cp        *ConstantPool	// 存常量池指针
	ClassName string
	Class     *Class
}

/*
类符号解析
 */
func (self *SymRef) ResolvedClass() *Class {
	if self.Class == nil {
		self.resolveClassRef()
	}
	return self.Class
}

/*
如果类D通过符号引用N引用类C的话，需要先解析N，
先用D加载器加载C
然后检查D是否有访问C的权限， 如果没有，抛出异常
 */
// jvms8 5.4.3.1
func (self *SymRef) resolveClassRef() {
	d := self.Cp.Class
	c := d.Loader.LoadClass(self.ClassName)
	if !c.isAccessibleTo(d) {
		panic("java.lang.IllegalAccessError")
	}

	self.Class = c
}

